# RVC Controller SW — System Sequence Diagrams (SSD)

| 항목 | 내용 |
|------|------|
| 문서 번호 | RVC-SSD-002 |
| 버전 | v2.0 |
| 작성일 | 2026-05-29 |
| 작성자 | OOAD Team 9 |
| 상태 | 초안 (Draft) |

---

## 변경 이력 (Change History)

| 버전 | 날짜 | 변경 내용 | 작성자 |
|------|------|-----------|--------|
| v1.0 | 2026-05-19 | 최초 작성 — SSD 5개 (시나리오 묶음) | OOAD Team 9 |
| v1.3 | 2026-05-19 | UC 8개와 1:1 대응하는 SSD 8개로 재구성 | OOAD Team 9 |
| v2.0 | 2026-05-29 | HW 변경 반영 — 우측 장애물 센서 제거. SSD-03·04·05 변경 | OOAD Team 9 |

---

## 개요

SSD(System Sequence Diagram)는 시스템을 **블랙박스**로 취급하여  
외부 Actor의 자극(Stimulus)과 시스템의 응답(Response) 흐름을 표현한다.  
각 SSD는 Use Case와 **1:1 대응**한다.

---

## v1 → v2 변경 요약 (Change Summary)

| SSD | 변경 구분 | 변경 내용 |
|-----|-----------|-----------|
| SSD-01 | — | 변경 없음 |
| SSD-02 | — | 변경 없음 |
| SSD-03 | **[변경]** | `checkSideObstacles(L+R)` → `checkLeftSensor()` + `turnRight90()` + `checkFrontSensor()` |
| SSD-04 | **[변경]** | `reportObstacle(RIGHT)` **[삭제]** — 우측 HW 센서 제거 |
| SSD-05 | **[변경]** | `turnToFreeDirection(BACK)` **[삭제]** → 후진 후 UC-03 방향 판단 로직 재적용 |
| SSD-06 | — | 변경 없음 |
| SSD-07 | — | 변경 없음 |
| SSD-08 | — | 변경 없음 |

---

## SSD 목록

| SSD ID | 대응 UC | Use Case 명 | 트리거 Actor | 변경 구분 |
|--------|---------|-------------|-------------|-----------|
| SSD-01 | UC-01 | Perform Normal Cleaning | RVC System (자체 시작) | — |
| SSD-02 | UC-02 | Detect Obstacle (Front) | Obstacle Sensor | — |
| SSD-03 | UC-03 | Avoid Front Obstacle | RVC System (UC-02 결과) | **[변경]** |
| SSD-04 | UC-04 | Detect Side Obstacles | Obstacle Sensor | **[변경]** |
| SSD-05 | UC-05 | Avoid All-Direction Obstacle | RVC System (UC-02 + UC-04 결과) | **[변경]** |
| SSD-06 | UC-06 | Detect Dust | Dust Sensor | — |
| SSD-07 | UC-07 | Boost Cleaning Power | RVC System (UC-06 결과) | — |
| SSD-08 | UC-08 | Handle Sensor Error | Sensor (any) | — |

---

## SSD-01 : UC-01 Perform Normal Cleaning

> **Actor:** RVC System (자체 시작)  
> **변경 구분:** —  
> **설명:** 장애물·먼지 이벤트 없이 직진하며 청소를 지속 수행

![SSD-01](diagrams/ssd_01.png)

---

## SSD-02 : UC-02 Detect Obstacle (Front)

> **Actor:** Obstacle Sensor  
> **변경 구분:** —  
> **설명:** 전방 센서가 장애물을 감지하여 Controller에 즉시 전달

![SSD-02](diagrams/ssd_02.png)

---

## SSD-03 : UC-03 Avoid Front Obstacle

> **Actor:** RVC System (UC-02 결과로 내부 트리거)  
> **변경 구분:** **[변경]**  
> **설명:** 전방 장애물 확인 후 정지 → 좌측 확인 → 좌측 여유 시 좌회전 / 좌측 막힘 시 우회전+전방 센서로 우측 확인 → 전진 재개

**v1 → v2 변경 상세:**

| 단계 | v1 | v2 | 변경 구분 |
|------|----|----|-----------|
| 측면 확인 | `checkSideObstacles()` — 좌·우 동시 조회 | `checkLeftSensor()` — 좌측만 직접 조회 | **[변경]** |
| 우측 확인 | 우측 HW 센서로 직접 감지 | `turnRight90()` 후 `checkFrontSensor()` 로 간접 감지 | **[추가]** |
| 분기 조건 | `LEFT or RIGHT free` (단일 alt) | `LEFT free` 먼저, 막히면 `RIGHT free (전방 센서 기준)` 2단계 alt | **[변경]** |

![SSD-03](diagrams/ssd_03.png)

---

## SSD-04 : UC-04 Detect Side Obstacles

> **Actor:** Obstacle Sensor  
> **변경 구분:** **[변경]**  
> **설명:** 좌측 센서가 장애물을 감지하여 Controller에 전달. 우측 HW 센서 없으므로 `reportObstacle(RIGHT)` 삭제

**v1 → v2 변경 상세:**

| 메시지 | v1 | v2 | 변경 구분 |
|--------|----|----|-----------|
| `reportObstacle(position: LEFT)` | 존재 | 존재 (동일) | — |
| `reportObstacle(position: RIGHT)` | 존재 | **삭제** | **[삭제]** |
| 우측 감지 방법 | 우측 HW 센서 → SYS | UC-03/05 내부에서 우회전+전방 센서로 수행 | **[변경]** |

![SSD-04](diagrams/ssd_04.png)

---

## SSD-05 : UC-05 Avoid All-Direction Obstacle

> **Actor:** RVC System (UC-02 + UC-04 결과로 내부 트리거)  
> **변경 구분:** **[변경]**  
> **설명:** 전·좌·우 모두 막힌 경우 후진 → 방향 재판단 (UC-03 로직) → 전진 재개

**v1 → v2 변경 상세:**

| 단계 | v1 | v2 | 변경 구분 |
|------|----|----|-----------|
| 후진 후 회전 | `turnToFreeDirection()` — BACK(180°) 포함 | 삭제 | **[삭제]** |
| 후진 후 방향 판단 | 없음 (고정 BACK 회전) | `checkLeftSensor()` + alt: LEFT free → 좌회전 / LEFT 막힘 → `turnRight90()` + `checkFrontSensor()` | **[추가]** |

![SSD-05](diagrams/ssd_05.png)

---

## SSD-06 : UC-06 Detect Dust

> **Actor:** Dust Sensor  
> **변경 구분:** —  
> **설명:** 먼지 센서가 먼지를 감지하여 Controller에 즉시 전달

![SSD-06](diagrams/ssd_06.png)

---

## SSD-07 : UC-07 Boost Cleaning Power

> **Actor:** RVC System (UC-06 결과로 내부 트리거)  
> **변경 구분:** —  
> **설명:** 먼지 감지 후 청소 파워 증가 → boostDuration 경과 후 자동 복귀

![SSD-07](diagrams/ssd_07.png)

---

## SSD-08 : UC-08 Handle Sensor Error

> **Actor:** Obstacle Sensor 또는 Dust Sensor  
> **변경 구분:** —  
> **설명:** 비정상 센서값 수신 시 무시 또는 안전 정지 처리

![SSD-08](diagrams/ssd_08.png)

---

## System Operations 정의

SSD에서 식별된 시스템 오퍼레이션 — Design 단계 `Controller` 인터페이스 후보

| System Operation | 파라미터 | 트리거 | 관련 SSD | 변경 구분 |
|------------------|----------|--------|---------|-----------|
| `startCleaning()` | — | RVC 시작 이벤트 | SSD-01 | — |
| `reportObstacle(position)` | position: SensorPosition{FRONT, LEFT} | Obstacle Sensor | SSD-02, SSD-04 | **[변경]** |
| `avoidFrontObstacle()` | — | UC-02 결과 (내부) | SSD-03 | **[변경]** |
| `avoidAllDirectionObstacle()` | — | UC-02+UC-04 결과 (내부) | SSD-05 | **[변경]** |
| `reportDust(dustLevel)` | dustLevel: float | Dust Sensor | SSD-06 | — |
| `boostCleaningPower()` | — | UC-06 결과 (내부) | SSD-07 | — |
| `reportSensorError(sensorId)` | sensorId: String | Sensor (any) | SSD-08 | — |

> **[변경] `reportObstacle(position)`:**  
> v1: `position`은 `SensorPosition{FRONT, LEFT, RIGHT}` 중 하나.  
> v2: 우측 HW 센서 제거로 `position`은 `SensorPosition{FRONT, LEFT}`만 허용.  
> RIGHT 방향 확인은 이 오퍼레이션이 아닌 `avoidFrontObstacle()` / `avoidAllDirectionObstacle()` 내부 기동으로 수행.
